package kin.system.util;

import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.List;

import kin.bean.security.Module;



public class TreeConvterUtil {
	private List<Module> pa = new ArrayList<Module>();
	private List<Module> ch = new ArrayList<Module>();

	
	
	public void test() {
		List<Module> li = new ArrayList<Module>();

		Module m1 = new Module();
		m1.setModule_id(1);
		li.add(m1);

		Module m2 = new Module();
		m2.setModule_id(2);
		m2.setParent(m1);
		li.add(m2);

		Module m3 = new Module();
		m3.setModule_id(3);
		m3.setParent(m1);
		li.add(m3);

		Module m4 = new Module();
		m4.setModule_id(4);
		li.add(m4);
		Module m5 = new Module();
		m5.setModule_id(5);
		m5.setParent(m4);
		li.add(m5);
		Module m6 = new Module();
		m6.setParent(m4);
		m6.setModule_id(6);
		li.add(m6);

		Module m7 = new Module();
		m7.setModule_id(7);
		m7.setParent(m5);
		li.add(m7);

		Module m8 = new Module();
		m8.setModule_id(8);
		m8.setParent(m2);
		li.add(m8);
		
		Module m9 = new Module();
		m9.setModule_id(9);
		m9.setParent(m2);
		li.add(m9);

		for (Module m : li) {
			if (m.getParent() == null) {
				pa.add(m);
			} else {
				ch.add(m);
			}
		}

		collectionToTree(pa, ch);

	}

	public List<Module> collectionToTree(List<Module> ppa, List<Module> children) {
		for (Module p : ppa) {
			tt(p, children);
		}
		System.out.print(ppa);
		return ppa;
	}

	private void tt(Module parent, List<Module> children)

	{

		Iterator it = ch.iterator();
		try {
			while (it.hasNext()) {
				Module c = (Module) it.next();

				if (parent.getModule_id() == c.getParent().getModule_id()) {
					if (parent.getChildren() == null) {
						parent.setChildren(new ArrayList<Module>());
						parent.getChildren().add(c);
					} else {

						parent.getChildren().add(c);
					}
					it.remove();
					ch.remove(c);
					tt(c, ch);
				} else {
					if (findByParent(parent, c)) {
						it.remove();
						ch.remove(c);
						tt(c, ch);
					} else {

						continue;
					}
				}
			}
		} catch (ConcurrentModificationException e) {

		}
	}

	private boolean findByParent(Module current, Module child) {
		
		if (current.getParent() != null) {
			if (current.getParent().getModule_id() == child.getParent()
					.getModule_id()) {

				current.getParent().getChildren().add(child);
				// ch.remove(child);
				return true;
			} else {
				return findByParent(current.getParent(), child);

			}
		} else {
			return false;
		}

	}

}
